package com.um2.simplexe.serveur.plugins.calcul3D.util;

public class UtilitaireCalcul3D {

	
	/**
	 * retourne le point d'intersection des 3 plans.
	 * @param p1
	 * @param p2
	 * @param p3
	 * @return
	 * @throws PlansParallelesException 
	 */
	public static Point intersectionDeTroisPlans (Plan p1,Plan p2,Plan p3) throws PlansParallelesException {
		
		
		
		// on a definit les trois
		// plans:
		// P1 = aX1  + bX2  + cX3  = d
		// P2 = a2X1 + b2X2 + c2X3 = d
		// P2 = a3X1 + b3X2 + c3X3 = d
		
		double a = p1.getA() ;
		double b = p1.getB() ;
		double c = p1.getC() ;
		double d = p1.getD() ;
		
		double a2 = p2.getA() ;
		double b2 = p2.getB() ;
		double c2 = p2.getC() ;
		double d2 = p2.getD() ;
		
		double a3 = p3.getA() ;
		double b3 = p3.getB() ;
		double c3 = p3.getC() ;
		double d3 = p3.getD() ;
		
		// le resultat :
		double X1 ;
		double X2 ;
		double X3 ;
		
		// la formule pour calculer X3 :
		X3 = ((a2*d+a*d2)*(b*a3-a*b3)-(a3*d-a*d3)*(b*a2-a*b2))/((c*a2-a*c2)*(b*a3-a*b3)-(c*a3-a*c3)*(b*a2-a*b2)) ;
		
		if (Double.isNaN(X3) || Double.isInfinite(X3))
			throw new PlansParallelesException("impossible de calculer l'intersection des plans ["+p1.toString()+","+p2.toString()+","+p3.toString()+"]") ;
		
		
		
		// OUFFFF !!!
		
		// maintenant X2 :
		X2=(a3*d-a*d3-X3*(c*a3-a*c3))/(b*a3-a*b3) ;

		if (Double.isNaN(X2) || Double.isInfinite(X2))
			throw new PlansParallelesException("impossible de calculer l'intersection des plans ["+p1.toString()+","+p2.toString()+","+p3.toString()+"]") ;
		

		// RE - OUFFFF !!!
		
		// enfin X1 :
		X1=(d-b*X2-c*X3)/a ;
		
		if (Double.isNaN(X1) || Double.isInfinite(X1))
			throw new PlansParallelesException("impossible de calculer l'intersection des plans ["+p1.toString()+","+p2.toString()+","+p3.toString()+"]") ;
		
		

		
		// on rend le resultat :
		Point res = null ;
		try {
			res = new Point(X1,X2,X3,p1.getNumero(),p2.getNumero(),p3.getNumero());
		} catch (Exception e) {
			System.err.println("erreur : "+e.getMessage()) ;
		}

		return res ;
	}
	
	
}
